Next.js ์ธ๋ถ ์ด๋ฏธ์ง ๋ถ๋ฌ์ค๊ธฐ ๋ฐ ์ต์ ํ ์๋ฒฝ ๊ฐ์ด๋
Next.js์ next/image๋ ์ด๋ฏธ์ง๋ฅผ ์๋์ผ๋ก ๋ฆฌ์ฌ์ด์งํ๊ณ ์ต์ ํํด์ฃผ๋ ๊ฐ๋ ฅํ ์ปดํฌ๋ํธ์
๋๋ค. ํ์ง๋ง ์ธ๋ถ URL์ ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ค๋ ค๋ฉด ๋ณด์์ ์ํ ์ถ๊ฐ ์ค์ ์ด ํ์ํฉ๋๋ค.
1. ์ ๋ณด์ ์ค์ ์ด ํ์ํ๊ฐ์?
์ฌ์ฉ์๊ฐ ์ ๋ ฅํ ์ ์์ ์ธ URL์ ํตํด ์ฐ๋ฆฌ ์๋ฒ์ ๋ฆฌ์์ค๋ฅผ ๋ญ๋นํ๊ฑฐ๋, ์ด๋ฏธ์ง ์ต์ ํ ์๋ฒ๋ฅผ ๊ณต๊ฒฉํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํจ์ ๋๋ค. ๋ฐ๋ผ์ ํ์ฉ๋ ๋๋ฉ์ธ(Hostname)๋ง ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ฌ ์ ์๋๋ก ํ์ดํธ๋ฆฌ์คํธ๋ฅผ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
2. remotePatterns ์ค์ (next.config.js)
๊ฐ์ฅ ์ ์ฐํ๊ณ ์์ ํ ๋ฐฉ์์ธ remotePatterns๋ฅผ ์ฌ์ฉํฉ๋๋ค.
// next.config.js
module.exports = {
images: {
remotePatterns: [
{
protocol: 'https',
hostname: 'images.unsplash.com', // ํน์ ํธ์คํธ ํ์ฉ
port: '',
pathname: '/**', // ๋ชจ๋ ๊ฒฝ๋ก ํ์ฉ
},
{
protocol: 'https',
hostname: '**.githubusercontent.com', // ์๋ธ๋๋ฉ์ธ ์์ผ๋์นด๋ ํ์ฉ
},
],
},
}3. ์ค์ ํ์ฉ ์ปดํฌ๋ํธ ์์
์ธ๋ถ ์ด๋ฏธ์ง์ ํฌ๊ธฐ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ ์๋ ๊ฒฝ์ฐ fill ์์ฑ์ ํ์ฉํ๋ ๊ฒ์ด ์ ์ฉํฉ๋๋ค.
๊ณตํต ์ด๋ฏธ์ง ์ปดํฌ๋ํธ (RemoteImage.tsx)
import Image from 'next/image'
interface Props {
src: string;
alt: string;
}
export default function RemoteImage({ src, alt }: Props) {
return (
<div className="relative aspect-video w-full overflow-hidden rounded-xl">
<Image
src={src}
alt={alt}
fill // ๋ถ๋ชจ ์ปจํ
์ด๋๋ฅผ ๊ฐ๋ ์ฑ์
className="object-cover" // CSS์ background-size: cover ์ญํ
sizes="(max-width: 768px) 100vw, (max-width: 1200px) 50vw, 33vw"
priority // ์ค์ํ ์ด๋ฏธ์ง๋ ์ฐ์ ์์ ๋ก๋
/>
</div>
)
}4. ์ฑ๋ฅ ์ต์ ํ ํ
sizes์์ฑ ํ์ฉ: ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์ ๋ง๋ ์ต์ ํฌ๊ธฐ์ ์ด๋ฏธ์ง๋ฅผ ์์ฒญํ๋๋ก ๋์์ค๋๋ค. ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก ๋ชจ๋ ๊ธฐ๊ธฐ์์ ํฐ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ ์ ์์ต๋๋ค.placeholder="blur": ์ด๋ฏธ์ง๊ฐ ๋ก๋๋๊ธฐ ์ ๋ถ๋๋ฌ์ด ๋ธ๋ฌ ํจ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ์ด ์ฌ์ฉ์ ๊ฒฝํ(UX)์ ๊ฐ์ ํฉ๋๋ค. (์ธ๋ถ ์ด๋ฏธ์ง๋ ๋ณ๋์blurDataURL์ด ํ์ํฉ๋๋ค.)priority: LCP(Largest Contentful Paint)์ ํด๋นํ๋ ๋ฉ์ธ ๋ฐฐ๋ ์ด๋ฏธ์ง ๋ฑ์๋ ๋ฐ๋์priority์์ฑ์ ์ถ๊ฐํ์ธ์.
5. ์์ฃผ ๋ฐ์ํ๋ ์๋ฌ ํด๊ฒฐ
- Error: Invalid src prop:
next.config.js์ ๋๋ฉ์ธ์ ๋ฑ๋กํ์ง ์์์ ๋ ๋ฐ์ํฉ๋๋ค. ์ค์ ์ ์์ ํ ํ์๋ ๋ฐ๋์ ์๋ฒ๋ฅผ ์ฌ์์ํด์ผ ์ ์ฉ๋ฉ๋๋ค. - ์ด๋ฏธ์ง ๊นจ์ง: ์ธ๋ถ ์๋ฒ์์
Referer์ฒดํฌ๋ฅผ ํ๊ฑฐ๋ ์ด๋ฏธ์ง๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ์ ๋๋ค. ์ด๋ด ๋๋onErrorํธ๋ค๋ฌ๋ฅผ ํตํด ๊ธฐ๋ณธ(Fallback) ์ด๋ฏธ์ง๋ฅผ ๋ณด์ฌ์ฃผ๋๋ก ๊ตฌํํ์ธ์.
6. ๊ฒฐ๋ก
์ธ๋ถ ์ด๋ฏธ์ง๋ฅผ ๋ค๋ฃฐ ๋๋ ๋ณด์ ์ค์ ์ ์ฒ ์ ํ ํ๊ณ , fill๊ณผ sizes๋ฅผ ์ ์ ํ ์กฐํฉํ์ฌ ์ฑ๋ฅ๊ณผ ๋์์ธ์ ๋์์ ์ก์ผ์ธ์. Next.js๊ฐ ์ ๊ณตํ๋ ์๋ ์ต์ ํ ๊ธฐ๋ฅ๋ง ์ ํ์ฉํด๋ ์น ์ฑ๋ฅ ์ ์(Lighthouse)๋ฅผ ํ๊ธฐ์ ์ผ๋ก ์ฌ๋ฆด ์ ์์ต๋๋ค.